package com.itheima.aop;

import com.itheima.mapper.OperateLogMapper;
import com.itheima.pojo.OperateLog;
import com.itheima.utils.JwtUtils;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

@Component //被spring管理
@Aspect //这是一个切面类 (面向特定方法编程  增强业务方法代码)
@Slf4j
public class LogAspect {

    @Autowired
    private OperateLogMapper operateLogMapper;

    @Autowired
    private HttpServletRequest request;

    @Around("@annotation(com.itheima.anno.Log)")
    public Object recordTime(ProceedingJoinPoint pjp) throws Throwable {
       //  1: 获取 操作人id
        // 先获取令牌  通过请求对象  --底层交给spring管理
        String token = request.getHeader("token");
        //解析token
        Map map = JwtUtils.parseJWT(token);
        //获取id
        Integer  id = (Integer)map.get("id");
        // 2: 操作时间

        //3: 操作类名

        //4:获取操作方法名

        // 5: 操作方法参数

        //6: 获取操作方法返回值

        //7.1  获取时间

        Object returnValue = pjp.proceed();//执行被增强方法  执行原始方法


        //在原始方法 运行后增强 7.2 获取时间


        // 得到日志中所需要的 各种信息  封装到 OperateLog 对象中
        // 调用 它的mapper 增加就可以了
        OperateLog operateLog = new OperateLog();
        operateLog.setOperateUser(id);
        operateLog.setReturnValue(returnValue+"");
       // 各种set
        // set完成之后

        operateLogMapper.insert(operateLog);
        return returnValue;
    }
}
